class Solution {
    int path; // 其子集异或的结果
    int ret;
public:
    int subsetXORSum(vector<int>& nums) {
        dfs(nums, 0);
        return ret;
    }
 
    void dfs(vector<int> nums, int pos)
    {
        ret += path;
        for(int i = pos; i < nums.size(); ++i)
        {
            path ^= nums[i];
            dfs(nums, i + 1);
            path ^= nums[i]; // 回溯，恢复现场
            // 异或两个一样的数相当没异或
        }
    }
};